home *** CD-ROM | disk | FTP | other *** search
/ ftp.mactech.com 2010 / ftp.mactech.com.tar / ftp.mactech.com / challenge / 13.08 / ChallengeEqEval.sit.hqx / Challenge, Equation Evaluator / CallGeneratedCode.c next >
Text File  |  1997-06-25  |  5KB  |  169 lines

  1. //
  2. //    CallGeneratedCode.c
  3. //
  4. //    MacTech Programmer's Challenge entry for May, 1997
  5. //    Written by Mark Day
  6. //
  7. //    Contains a glue routine used to call the PowerPC code produced
  8. //    by CodeGen.c
  9. //
  10.  
  11.  
  12. #include "Evaluate.h"
  13.  
  14. typedef struct {
  15.     unsigned long    savedSP;
  16.     unsigned long    savedCR;
  17.     unsigned long    savedLR;
  18.     unsigned long    reserved1;
  19.     unsigned long    reserved2;
  20.     unsigned long    savedTOC;
  21. } Linkage;
  22.  
  23. typedef struct {
  24.     Linkage    linkage;
  25.     long    arguments[8];        //    set aside maximum room for called functions
  26.     long    savedGPR[20];        //    r13-r31        (last location is not used)
  27.     double    savedFPR[18];        //    fp14-fp31
  28. } StackFrame;
  29.  
  30. enum { StackFrameSize = sizeof(StackFrame) };
  31.  
  32. //
  33. //    Saves registers and sets up parameter area for generated code.
  34. //    The generated code may save the link register in the linkage area.
  35. //    Since the generated code never uses the TOC register itself, it is
  36. //    sufficient to save and restore it here in case the generated code
  37. //    calls to a different fragment.
  38. //
  39. asm float CallGeneratedCode(register void *addr,        //    first instruction to execute
  40.                             register const Values *xValues, register const Values *yValues,
  41.                             register const IntValues *nIntValues, register const Values *nValues,
  42.                             register Results *resultsPtr,
  43.                             register float *constants, register void *functions,
  44.                             register float eValue, register float piValue)
  45. {
  46.         //
  47.         //    Save our return address and TOC
  48.         //
  49.         mflr    r0
  50.         stw        r2,Linkage.savedTOC(SP)
  51.         stw        r0,Linkage.savedLR(SP)
  52.  
  53.         //
  54.         //    Make new stack frame
  55.         //
  56.         stwu    SP,-StackFrameSize(SP)
  57.         
  58.         //
  59.         //    Save non-volatile FPRs
  60.         //
  61.         stfd    fp14,StackFrame.savedFPR[0](SP)
  62.         stfd    fp15,StackFrame.savedFPR[1](SP)
  63.         stfd    fp16,StackFrame.savedFPR[2](SP)
  64.         stfd    fp17,StackFrame.savedFPR[3](SP)
  65.         stfd    fp18,StackFrame.savedFPR[4](SP)
  66.         stfd    fp19,StackFrame.savedFPR[5](SP)
  67.         stfd    fp20,StackFrame.savedFPR[6](SP)
  68.         stfd    fp21,StackFrame.savedFPR[7](SP)
  69.         stfd    fp22,StackFrame.savedFPR[8](SP)
  70.         stfd    fp23,StackFrame.savedFPR[9](SP)
  71.         stfd    fp24,StackFrame.savedFPR[10](SP)
  72.         stfd    fp25,StackFrame.savedFPR[11](SP)
  73.         stfd    fp26,StackFrame.savedFPR[12](SP)
  74.         stfd    fp27,StackFrame.savedFPR[13](SP)
  75.         stfd    fp28,StackFrame.savedFPR[14](SP)
  76.         stfd    fp29,StackFrame.savedFPR[15](SP)
  77.         stfd    fp30,StackFrame.savedFPR[16](SP)
  78.         stfd    fp31,StackFrame.savedFPR[17](SP)
  79.  
  80.         //
  81.         //    Save non-volatile GPRs
  82.         //
  83.         stw        r13,StackFrame.savedGPR[0](SP)
  84.         stw        r14,StackFrame.savedGPR[1](SP)
  85.         stw        r15,StackFrame.savedGPR[2](SP)
  86.         stw        r16,StackFrame.savedGPR[3](SP)
  87.         stw        r17,StackFrame.savedGPR[4](SP)
  88.         stw        r18,StackFrame.savedGPR[5](SP)
  89.         stw        r19,StackFrame.savedGPR[6](SP)
  90.         stw        r20,StackFrame.savedGPR[7](SP)
  91.         stw        r21,StackFrame.savedGPR[8](SP)
  92.         stw        r22,StackFrame.savedGPR[9](SP)
  93.         stw        r23,StackFrame.savedGPR[10](SP)
  94.         stw        r24,StackFrame.savedGPR[11](SP)
  95.         
  96.         //
  97.         //    Pass input parameters to generated code
  98.         //
  99.         fmr        fp30,eValue
  100.         fmr        fp31,piValue
  101.         mr        r13,constants
  102.         mr        r14,functions
  103.         mr        r16,xValues
  104.         mr        r17,yValues
  105.         mr        r18,nValues
  106.         mr        r19,nIntValues
  107.         subi    r20,resultsPtr,4    // set up results-4
  108.         
  109.         //
  110.         //    Call function at addr
  111.         //
  112.         mtctr    addr
  113.         bl        GoToCTR        //    this sets up LR to return to us
  114.  
  115.         //
  116.         //    Restore GPRs
  117.         //
  118.         lwz        r13,StackFrame.savedGPR[0](SP)
  119.         lwz        r14,StackFrame.savedGPR[1](SP)
  120.         lwz        r15,StackFrame.savedGPR[2](SP)
  121.         lwz        r16,StackFrame.savedGPR[3](SP)
  122.         lwz        r17,StackFrame.savedGPR[4](SP)
  123.         lwz        r18,StackFrame.savedGPR[5](SP)
  124.         lwz        r19,StackFrame.savedGPR[6](SP)
  125.         lwz        r20,StackFrame.savedGPR[7](SP)
  126.         lwz        r21,StackFrame.savedGPR[8](SP)
  127.         lwz        r22,StackFrame.savedGPR[9](SP)
  128.         lwz        r23,StackFrame.savedGPR[10](SP)
  129.         lwz        r24,StackFrame.savedGPR[11](SP)
  130.         
  131.         //
  132.         //    Restore FPRs
  133.         //
  134.         lfd        fp14,StackFrame.savedFPR[0](SP)
  135.         lfd        fp15,StackFrame.savedFPR[1](SP)
  136.         lfd        fp16,StackFrame.savedFPR[2](SP)
  137.         lfd        fp17,StackFrame.savedFPR[3](SP)
  138.         lfd        fp18,StackFrame.savedFPR[4](SP)
  139.         lfd        fp19,StackFrame.savedFPR[5](SP)
  140.         lfd        fp20,StackFrame.savedFPR[6](SP)
  141.         lfd        fp21,StackFrame.savedFPR[7](SP)
  142.         lfd        fp22,StackFrame.savedFPR[8](SP)
  143.         lfd        fp23,StackFrame.savedFPR[9](SP)
  144.         lfd        fp24,StackFrame.savedFPR[10](SP)
  145.         lfd        fp25,StackFrame.savedFPR[11](SP)
  146.         lfd        fp26,StackFrame.savedFPR[12](SP)
  147.         lfd        fp27,StackFrame.savedFPR[13](SP)
  148.         lfd        fp28,StackFrame.savedFPR[14](SP)
  149.         lfd        fp29,StackFrame.savedFPR[15](SP)
  150.         lfd        fp30,StackFrame.savedFPR[16](SP)
  151.         lfd        fp31,StackFrame.savedFPR[17](SP)
  152.         
  153.         //
  154.         //    Unwind stack frame
  155.         //
  156.         addi    SP,SP,StackFrameSize
  157.         
  158.         //
  159.         //    Restore TOC and return
  160.         //
  161.         lwz        r0,Linkage.savedLR(SP)
  162.         lwz        r2,Linkage.savedTOC(SP)
  163.         mtlr    r0
  164.         blr
  165.         
  166. GoToCTR:
  167.         bctr
  168. }
  169.